home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Add-Ons / MPW / MPW re2c 1.1 / scanner.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-15  |  9.0 KB  |  488 lines  |  [TEXT/MPS ]

  1. /* Generated by re2c on Fri Apr  8 11:19:32 1994 */
  2. #line 1 "scanner.re"
  3. // $Log: scanner.re,v $
  4. // Revision 1.5  1993/10/04  02:08:25  peter
  5. // *** empty log message ***
  6. //
  7. // Revision 1.4  1993/09/03  16:00:05  peter
  8. // *** empty log message ***
  9. //
  10. // Revision 1.3  1993/06/16  21:30:02  peter
  11. // convert to yacc generated parser.
  12. //
  13. // Revision 1.2  1993/05/23  14:50:28  peter
  14. // *** empty log message ***
  15. //
  16. // Revision 1.1  1993/05/22  14:45:21  peter
  17. // Initial revision
  18. //
  19.  
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <iostream.h>
  23. #include <unistd.h>
  24. #include "scanner.h"
  25. #include "parser.h"
  26. #include "y.tab.h"
  27.  
  28. extern YYSTYPE yylval;
  29.  
  30. #define    BSIZE    8192
  31.  
  32. #define    YYCTYPE        uchar
  33. #define    YYCURSOR    cursor
  34. #define    YYLIMIT        lim
  35. #define    YYMARKER    ptr
  36. #define    YYFILL(n)    {cursor = fill(cursor);}
  37.  
  38. #define    RETURN(i)    {cur = cursor; return i;}
  39.  
  40.  
  41. Scanner::Scanner(int i) : in(i),
  42.     bot(NULL), tok(NULL), ptr(NULL), cur(NULL), pos(NULL), lim(NULL),
  43.     top(NULL), eof(NULL), tchar(0), tline(0), cline(1) {
  44.     ;
  45. }
  46.  
  47. uchar *Scanner::fill(uchar *cursor){
  48.     if(!eof){
  49.     uint cnt = tok - bot;
  50.     if(cnt){
  51.         memcpy(bot, tok, lim - tok);
  52.         tok = bot;
  53.         ptr -= cnt;
  54.         cursor -= cnt;
  55.         pos -= cnt;
  56.         lim -= cnt;
  57.     }
  58.     if((top - lim) < BSIZE){
  59.         uchar *buf = new uchar[(lim - bot) + BSIZE];
  60.         memcpy(buf, tok, lim - tok);
  61.         tok = buf;
  62.         ptr = &buf[ptr - bot];
  63.         cursor = &buf[cursor - bot];
  64.         pos = &buf[pos - bot];
  65.         lim = &buf[lim - bot];
  66.         top = &lim[BSIZE];
  67.         delete bot;
  68.         bot = buf;
  69.     }
  70.     if((cnt = read(in, (char*) lim, BSIZE)) != BSIZE){
  71.         eof = &lim[cnt]; *eof++ = '\n';
  72.     }
  73.     lim += cnt;
  74.     }
  75.     return cursor;
  76. }
  77.  
  78. #line 85
  79.  
  80.  
  81. int Scanner::echo(ostream &out){
  82.     uchar *cursor = cur;
  83.     tok = cursor;
  84. echo:
  85. {
  86.     YYCTYPE yych;
  87.     unsigned int yyaccept;
  88.     goto yy0;
  89. yy1:    ++YYCURSOR;
  90. yy0:
  91.     if((YYLIMIT - YYCURSOR) < 7) YYFILL(7);
  92.     yych = *YYCURSOR;
  93.     if(yych == '\n')    goto yy4;
  94.     if(yych != '/')    goto yy6;
  95. yy2:    yyaccept = 0;
  96.     yych = *(YYMARKER = ++YYCURSOR);
  97.     if(yych == '*')    goto yy7;
  98. yy3:
  99. #line 99
  100.     { goto echo; }
  101. yy4:    yych = *++YYCURSOR;
  102. yy5:
  103. #line 95
  104.     { if(cursor == eof) RETURN(0);
  105.                   out.write(tok, cursor - tok);
  106.                   tok = pos = cursor; cline++;
  107.                   goto echo; }
  108. yy6:    yych = *++YYCURSOR;
  109.     goto yy3;
  110. yy7:    yych = *++YYCURSOR;
  111.     if(yych == '!')    goto yy9;
  112. yy8:    YYCURSOR = YYMARKER;
  113.     switch(yyaccept){
  114.     case 0:    goto yy3;
  115.     }
  116. yy9:    yych = *++YYCURSOR;
  117.     if(yych != 'r')    goto yy8;
  118. yy10:    yych = *++YYCURSOR;
  119.     if(yych != 'e')    goto yy8;
  120. yy11:    yych = *++YYCURSOR;
  121.     if(yych != '2')    goto yy8;
  122. yy12:    yych = *++YYCURSOR;
  123.     if(yych != 'c')    goto yy8;
  124. yy13:    yych = *++YYCURSOR;
  125. yy14:
  126. #line 92
  127.     { out.write(tok, &cursor[-7] - tok);
  128.                   tok = cursor;
  129.                   RETURN(1); }
  130. }
  131. #line 100
  132.  
  133. }
  134.  
  135.  
  136. int Scanner::scan(){
  137.     uchar *cursor = cur;
  138.     uint depth;
  139.  
  140. scan:
  141.     tchar = cursor - pos;
  142.     tline = cline;
  143.     tok = cursor;
  144. {
  145.     YYCTYPE yych;
  146.     unsigned int yyaccept;
  147.     goto yy15;
  148. yy16:    ++YYCURSOR;
  149. yy15:
  150.     if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
  151.     yych = *YYCURSOR;
  152.     if(yych <= ':'){
  153.         if(yych <= '"'){
  154.             if(yych <= '\n'){
  155.                 if(yych <= '\b')    goto yy35;
  156.                 if(yych <= '\t')    goto yy31;
  157.                 goto yy33;
  158.             } else {
  159.                 if(yych == ' ')    goto yy31;
  160.                 if(yych <= '!')    goto yy35;
  161.                 goto yy23;
  162.             }
  163.         } else {
  164.             if(yych <= '*'){
  165.                 if(yych <= '\'')    goto yy35;
  166.                 if(yych <= ')')    goto yy27;
  167.                 goto yy21;
  168.             } else {
  169.                 if(yych <= '+')    goto yy28;
  170.                 if(yych == '/')    goto yy19;
  171.                 goto yy35;
  172.             }
  173.         }
  174.     } else {
  175.         if(yych <= 'Z'){
  176.             if(yych <= '='){
  177.                 if(yych == '<')    goto yy35;
  178.                 goto yy27;
  179.             } else {
  180.                 if(yych == '?')    goto yy28;
  181.                 if(yych <= '@')    goto yy35;
  182.                 goto yy29;
  183.             }
  184.         } else {
  185.             if(yych <= '`'){
  186.                 if(yych <= '[')    goto yy25;
  187.                 if(yych <= '\\')    goto yy27;
  188.                 goto yy35;
  189.             } else {
  190.                 if(yych <= 'z')    goto yy29;
  191.                 if(yych <= '{')    goto yy17;
  192.                 if(yych <= '|')    goto yy27;
  193.                 goto yy35;
  194.             }
  195.         }
  196.     }
  197. yy17:    yych = *++YYCURSOR;
  198. yy18:
  199. #line 113
  200.     { depth = 1;
  201.                   goto code;
  202.                 }
  203. yy19:    yych = *++YYCURSOR;
  204.     if(yych == '*')    goto yy54;
  205. yy20:
  206. #line 132
  207.     { RETURN(*tok); }
  208. yy21:    yych = *++YYCURSOR;
  209.     if(yych == '/')    goto yy52;
  210. yy22:
  211. #line 134
  212.     { yylval.op = *tok;
  213.                   RETURN(CLOSE); }
  214. yy23:    yyaccept = 0;
  215.     yych = *(YYMARKER = ++YYCURSOR);
  216.     if(yych != '\n')    goto yy48;
  217. yy24:
  218. #line 125
  219.     { fatal("bad string"); }
  220. yy25:    yyaccept = 1;
  221.     yych = *(YYMARKER = ++YYCURSOR);
  222.     if(yych != '\n')    goto yy42;
  223. yy26:
  224. #line 130
  225.     { fatal("bad character constant"); }
  226. yy27:    yych = *++YYCURSOR;
  227.     goto yy20;
  228. yy28:    yych = *++YYCURSOR;
  229.     goto yy22;
  230. yy29:    yych = *++YYCURSOR;
  231.     goto yy40;
  232. yy30:
  233. #line 137
  234.     { cur = cursor;
  235.                   yylval.symbol = Symbol::find(token());
  236.                   return ID; }
  237. yy31:    yych = *++YYCURSOR;
  238.     goto yy38;
  239. yy32:
  240. #line 141
  241.     { goto scan; }
  242. yy33:    yych = *++YYCURSOR;
  243. yy34:
  244. #line 143
  245.     { if(cursor == eof) RETURN(0);
  246.                   pos = cursor; cline++;
  247.                   goto scan;
  248.                     }
  249. yy35:    yych = *++YYCURSOR;
  250. yy36:
  251. #line 148
  252.     { cerr << "unexpected character: " << *tok << endl;
  253.                   goto scan;
  254.                 }
  255. yy37:    ++YYCURSOR;
  256.     if(YYLIMIT == YYCURSOR) YYFILL(1);
  257.     yych = *YYCURSOR;
  258. yy38:    if(yych == '\t')    goto yy37;
  259.     if(yych == ' ')    goto yy37;
  260.     goto yy32;
  261. yy39:    ++YYCURSOR;
  262.     if(YYLIMIT == YYCURSOR) YYFILL(1);
  263.     yych = *YYCURSOR;
  264. yy40:    if(yych <= '@'){
  265.         if(yych <= '/')    goto yy30;
  266.         if(yych <= '9')    goto yy39;
  267.         goto yy30;
  268.     } else {
  269.         if(yych <= 'Z')    goto yy39;
  270.         if(yych <= '`')    goto yy30;
  271.         if(yych <= 'z')    goto yy39;
  272.         goto yy30;
  273.     }
  274. yy41:    ++YYCURSOR;
  275.     if(YYLIMIT == YYCURSOR) YYFILL(1);
  276.     yych = *YYCURSOR;
  277. yy42:    if(yych <= '['){
  278.         if(yych != '\n')    goto yy41;
  279.     } else {
  280.         if(yych <= '\\')    goto yy44;
  281.         if(yych <= ']')    goto yy45;
  282.         goto yy41;
  283.     }
  284. yy43:    YYCURSOR = YYMARKER;
  285.     switch(yyaccept){
  286.     case 0:    goto yy24;
  287.     case 1:    goto yy26;
  288.     }
  289. yy44:    ++YYCURSOR;
  290.     if(YYLIMIT == YYCURSOR) YYFILL(1);
  291.     yych = *YYCURSOR;
  292.     if(yych == '\n')    goto yy43;
  293.     goto yy41;
  294. yy45:    yych = *++YYCURSOR;
  295. yy46:
  296. #line 127
  297.     { cur = cursor;
  298.                   yylval.regexp = ranToRE(token());
  299.                   return RANGE; }
  300. yy47:    ++YYCURSOR;
  301.     if(YYLIMIT == YYCURSOR) YYFILL(1);
  302.     yych = *YYCURSOR;
  303. yy48:    if(yych <= '!'){
  304.         if(yych == '\n')    goto yy43;
  305.         goto yy47;
  306.     } else {
  307.         if(yych <= '"')    goto yy50;
  308.         if(yych != '\\')    goto yy47;
  309.     }
  310. yy49:    ++YYCURSOR;
  311.     if(YYLIMIT == YYCURSOR) YYFILL(1);
  312.     yych = *YYCURSOR;
  313.     if(yych == '\n')    goto yy43;
  314.     goto yy47;
  315. yy50:    yych = *++YYCURSOR;
  316. yy51:
  317. #line 122
  318.     { cur = cursor;
  319.                   yylval.regexp = strToRE(token());
  320.                   return STRING; }
  321. yy52:    yych = *++YYCURSOR;
  322. yy53:
  323. #line 119
  324.     { tok = cursor;
  325.                   RETURN(0); }
  326. yy54:    yych = *++YYCURSOR;
  327. yy55:
  328. #line 116
  329.     { depth = 1;
  330.                   goto comment; }
  331. }
  332. #line 151
  333.  
  334.  
  335. code:
  336. {
  337.     YYCTYPE yych;
  338.     unsigned int yyaccept;
  339.     goto yy56;
  340. yy57:    ++YYCURSOR;
  341. yy56:
  342.     if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
  343.     yych = *YYCURSOR;
  344.     if(yych <= '&'){
  345.         if(yych <= '\n'){
  346.             if(yych <= '\t')    goto yy64;
  347.             goto yy62;
  348.         } else {
  349.             if(yych == '"')    goto yy66;
  350.             goto yy64;
  351.         }
  352.     } else {
  353.         if(yych <= '{'){
  354.             if(yych <= '\'')    goto yy67;
  355.             if(yych <= 'z')    goto yy64;
  356.             goto yy60;
  357.         } else {
  358.             if(yych != '}')    goto yy64;
  359.         }
  360.     }
  361. yy58:    yych = *++YYCURSOR;
  362. yy59:
  363. #line 155
  364.     { if(--depth == 0){
  365.                     cur = cursor;
  366.                     yylval.token = new Token(token(), tline);
  367.                     return CODE;
  368.                   }
  369.                   goto code; }
  370. yy60:    yych = *++YYCURSOR;
  371. yy61:
  372. #line 161
  373.     { ++depth;
  374.                   goto code; }
  375. yy62:    yych = *++YYCURSOR;
  376. yy63:
  377. #line 163
  378.     { if(cursor == eof) fatal("missing '}'");
  379.                   pos = cursor; cline++;
  380.                   goto code;
  381.                 }
  382. yy64:    yych = *++YYCURSOR;
  383. yy65:
  384. #line 167
  385.     { goto code; }
  386. yy66:    yyaccept = 0;
  387.     yych = *(YYMARKER = ++YYCURSOR);
  388.     if(yych == '\n')    goto yy65;
  389.     goto yy73;
  390. yy67:    yyaccept = 0;
  391.     yych = *(YYMARKER = ++YYCURSOR);
  392.     if(yych == '\n')    goto yy65;
  393.     goto yy69;
  394. yy68:    ++YYCURSOR;
  395.     if(YYLIMIT == YYCURSOR) YYFILL(1);
  396.     yych = *YYCURSOR;
  397. yy69:    if(yych <= '&'){
  398.         if(yych != '\n')    goto yy68;
  399.     } else {
  400.         if(yych <= '\'')    goto yy64;
  401.         if(yych == '\\')    goto yy71;
  402.         goto yy68;
  403.     }
  404. yy70:    YYCURSOR = YYMARKER;
  405.     switch(yyaccept){
  406.     case 0:    goto yy65;
  407.     }
  408. yy71:    ++YYCURSOR;
  409.     if(YYLIMIT == YYCURSOR) YYFILL(1);
  410.     yych = *YYCURSOR;
  411.     if(yych == '\n')    goto yy70;
  412.     goto yy68;
  413. yy72:    ++YYCURSOR;
  414.     if(YYLIMIT == YYCURSOR) YYFILL(1);
  415.     yych = *YYCURSOR;
  416. yy73:    if(yych <= '!'){
  417.         if(yych == '\n')    goto yy70;
  418.         goto yy72;
  419.     } else {
  420.         if(yych <= '"')    goto yy64;
  421.         if(yych != '\\')    goto yy72;
  422.     }
  423. yy74:    ++YYCURSOR;
  424.     if(YYLIMIT == YYCURSOR) YYFILL(1);
  425.     yych = *YYCURSOR;
  426.     if(yych == '\n')    goto yy70;
  427.     goto yy72;
  428. }
  429. #line 168
  430.  
  431.  
  432. comment:
  433. {
  434.     YYCTYPE yych;
  435.     unsigned int yyaccept;
  436.     goto yy75;
  437. yy76:    ++YYCURSOR;
  438. yy75:
  439.     if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
  440.     yych = *YYCURSOR;
  441.     if(yych <= ')'){
  442.         if(yych == '\n')    goto yy80;
  443.         goto yy82;
  444.     } else {
  445.         if(yych <= '*')    goto yy77;
  446.         if(yych == '/')    goto yy79;
  447.         goto yy82;
  448.     }
  449. yy77:    yych = *++YYCURSOR;
  450.     if(yych == '/')    goto yy85;
  451. yy78:
  452. #line 182
  453.     { goto comment; }
  454. yy79:    yych = *++YYCURSOR;
  455.     if(yych == '*')    goto yy83;
  456.     goto yy78;
  457. yy80:    yych = *++YYCURSOR;
  458. yy81:
  459. #line 178
  460.     { if(cursor == eof) RETURN(0);
  461.                   tok = pos = cursor; cline++;
  462.                   goto comment;
  463.                 }
  464. yy82:    yych = *++YYCURSOR;
  465.     goto yy78;
  466. yy83:    yych = *++YYCURSOR;
  467. yy84:
  468. #line 176
  469.     { ++depth;
  470.                   goto comment; }
  471. yy85:    yych = *++YYCURSOR;
  472. yy86:
  473. #line 172
  474.     { if(--depth == 0)
  475.                     goto scan;
  476.                     else
  477.                     goto comment; }
  478. }
  479. #line 183
  480.  
  481. }
  482.  
  483. void Scanner::fatal(char *msg){
  484.     cerr << "line " << tline << ", column " << (tchar + 1) << ": "
  485.     << msg << endl;
  486.     exit(1);
  487. }
  488.